/* USER CODE BEGIN Header */
/**
  ******************************************************************************
  * File Name          : freertos.c
  * Description        : Code for freertos applications
  ******************************************************************************
  * @attention
  *
  * Copyright (c) 2025 STMicroelectronics.
  * All rights reserved.
  *
  * This software is licensed under terms that can be found in the LICENSE file
  * in the root directory of this software component.
  * If no LICENSE file comes with this software, it is provided AS-IS.
  *
  ******************************************************************************
  */
/* USER CODE END Header */

/* Includes ------------------------------------------------------------------*/
#include "FreeRTOS.h"
#include "task.h"
#include "main.h"
#include "cmsis_os.h"

/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "usart.h"
#include "store.h"
#include "dataProcess.h"
#include "uartPort.h"
#include "cmd.h"
#include "norflash.h"
#include "SEGGER_RTT.h"
#include "printf.h"
#include "dataPool.h"
#include "key.h"
#include "state.h"
#include "ledControl.h"
/* USER CODE END Includes */

/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */

/* USER CODE END PTD */

/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */

/* USER CODE END PD */

/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */

/* USER CODE END PM */

/* Private variables ---------------------------------------------------------*/
/* USER CODE BEGIN Variables */
/* USER CODE END Variables */
/* Definitions for defaultTask */
osThreadId_t defaultTaskHandle;
const osThreadAttr_t defaultTask_attributes = {
  .name = "defaultTask",
  .stack_size = 128 * 4,
  .priority = (osPriority_t) osPriorityNormal,
};

/* Private function prototypes -----------------------------------------------*/
/* USER CODE BEGIN FunctionPrototypes */
/* USER CODE END FunctionPrototypes */

void StartDefaultTask(void *argument);

void MX_FREERTOS_Init(void); /* (MISRA C 2004 rule 8.1) */

/**
  * @brief  FreeRTOS initialization
  * @param  None
  * @retval None
  */
void MX_FREERTOS_Init(void) {
  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* USER CODE BEGIN RTOS_MUTEX */
  /* add mutexes, ... */
  /* USER CODE END RTOS_MUTEX */

  /* USER CODE BEGIN RTOS_SEMAPHORES */
  /* add semaphores, ... */
  /* USER CODE END RTOS_SEMAPHORES */

  /* USER CODE BEGIN RTOS_TIMERS */
  /* start timers, add new ones, ... */
  /* USER CODE END RTOS_TIMERS */

  /* USER CODE BEGIN RTOS_QUEUES */
  /* add queues, ... */
  /* USER CODE END RTOS_QUEUES */

  /* Create the thread(s) */
  /* creation of defaultTask */
  defaultTaskHandle = osThreadNew(StartDefaultTask, NULL, &defaultTask_attributes);

  /* USER CODE BEGIN RTOS_THREADS */
  /* add threads, ... */
  /* USER CODE END RTOS_THREADS */

  /* USER CODE BEGIN RTOS_EVENTS */
  /* add events, ... */
  /* USER CODE END RTOS_EVENTS */

}

/* USER CODE BEGIN Header_StartDefaultTask */
/**
  * @brief  Function implementing the defaultTask thread.
  * @param  argument: Not used
  * @retval None
  */
/* USER CODE END Header_StartDefaultTask */
void StartDefaultTask(void *argument)
{
  /* USER CODE BEGIN StartDefaultTask */
  SEGGER_RTT_WriteString(0,"hello,this is segger");
  ledControl_init();
  SEGGER_RTT_WriteString(0,"led Ok\r\n");
  norflash_init();
  SEGGER_RTT_WriteString(0,"flash init\r\n");
  key_init();
  SEGGER_RTT_WriteString(0,"key init Ok\r\n");
  state_init();
  SEGGER_RTT_WriteString(0,"state init Ok\r\n");
  cmd_init();
  SEGGER_RTT_WriteString(0,"cmd Ok\r\n");
  reInitByStore();
  SEGGER_RTT_WriteString(0,"baud reset Ok\r\n");
  dataPool_init();
  SEGGER_RTT_WriteString(0,"dataPool Ok\r\n");
  /* Infinite loop */
  for(;;)
  {
//     typedef struct{
//     uint8_t(* pool)[DATA_POOL_SIZE];
//     uint8_t num;
//     uint16_t size;
//     osMessageQueueId_t queue;
//   }DataPoolHeadle;
// extern DataPoolHeadle dataPoolHeadle;
//     uint32_t nums = osMessageQueueGetCount(dataPoolHeadle.queue); 
//     char str[10];
//     sprintf(str,"%lu\r\n",nums);
//     SEGGER_RTT_WriteString(0,str);
    uint8_t key = key_scan();
    static uint8_t isInit = 0;
    //减少锁的损耗
    if(key == 0){
      osDelay(100);
      continue;
    }
    osMutexAcquire(state_mutex,osWaitForever);
    if(state == STATE_STOP && key == KEY0_PRES){
      if(isInit == 0){
        isInit = 1;
        dataProcess_init();
        uartPort_init();
      }
      else{
        uartPort_start();
      }
      SEGGER_RTT_WriteString(0,"STATE_RUN\r\n");
      state = STATE_RUN;
      ledRouse();
      osMutexRelease(state_mutex);
    }
    else if(state == STATE_RUN && key == KEY0_PRES){
      state = STATE_STOP;
      ledRouse();
      uartPort_stop();
      SEGGER_RTT_WriteString(0,"STATE_STOP\r\n");
      osMutexRelease(state_mutex);
    }
    else{
      osMutexRelease(state_mutex);
    }
    osDelay(100);
  }
  /* USER CODE END StartDefaultTask */
}

/* Private application code --------------------------------------------------*/
/* USER CODE BEGIN Application */

/* USER CODE END Application */

